package com.okwanshiwu.payment.wxUtil;

import java.io.IOException;
import java.io.Serializable;
import java.io.StringReader;
import java.util.List;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.xml.sax.InputSource;

/**
 * 微信订单查询
 * */
public class WXQueryOrderResult implements Serializable {

	private static final long serialVersionUID = 3663417330812229444L;
	
	private String return_code; //非交易标识,请求是否成功
	private String return_msg; //请求结果描述
	private String appid; //appid
	private String mch_id; //商户号
	private String nonce_str; //随机字符串
	private String sign; //签名
	private String result_code; //操作结果
	private String err_code; //错误吗
	private String err_code_des; //结果信息描述
	private String device_info; //微信支付分配的终端设备号
	private String openid; //用户标识
	private String is_subscribe; //用户是否关注公众账号，Y-关注，N-未关注，仅在公众账号类型支付有效
	private String trade_type; //调用接口提交的交易类型
	private String trade_state; //交易状态
	private String bank_type; //付款银行
	private int total_fee; //总金额
	private String fee_type; //货币种类
	private int cash_fee; //现金支付金额
	private String cash_fee_type; //货币类型，符合ISO 4217标准的三位字母代码，默认人民币：CNY，其他值列表详见货币类型
	private int coupon_fee; //代金券或立减优惠”金额<=订单总金额，订单总金额-“代金券或立减优惠”金额=现金支付金额，详见支付金额
	private int coupon_count; //代金券或立减优惠使用数量
	private String transaction_id; //微信支付订单号
	private String out_trade_no; //商户订单号
	private String attach; //附加数据，原样返回
	private String time_end; //订单支付时间，格式为yyyyMMddHHmmss，如2009年12月25日9点10分10秒表示为20091225091010。其他详见时间规则
	private String trade_state_desc; //对当前查询订单状态的描述和下一步操作的指引
	public String getReturn_code() {
		return return_code;
	}
	public void setReturn_code(String return_code) {
		this.return_code = return_code;
	}
	public String getReturn_msg() {
		return return_msg;
	}
	public void setReturn_msg(String return_msg) {
		this.return_msg = return_msg;
	}
	public String getAppid() {
		return appid;
	}
	public void setAppid(String appid) {
		this.appid = appid;
	}
	public String getMch_id() {
		return mch_id;
	}
	public void setMch_id(String mch_id) {
		this.mch_id = mch_id;
	}
	public String getNonce_str() {
		return nonce_str;
	}
	public void setNonce_str(String nonce_str) {
		this.nonce_str = nonce_str;
	}
	public String getSign() {
		return sign;
	}
	public void setSign(String sign) {
		this.sign = sign;
	}
	public String getResult_code() {
		return result_code;
	}
	public void setResult_code(String result_code) {
		this.result_code = result_code;
	}
	public String getErr_code() {
		return err_code;
	}
	public void setErr_code(String err_code) {
		this.err_code = err_code;
	}
	public String getErr_code_des() {
		return err_code_des;
	}
	public void setErr_code_des(String err_code_des) {
		this.err_code_des = err_code_des;
	}
	public String getDevice_info() {
		return device_info;
	}
	public void setDevice_info(String device_info) {
		this.device_info = device_info;
	}
	public String getOpenid() {
		return openid;
	}
	public void setOpenid(String openid) {
		this.openid = openid;
	}
	public String getIs_subscribe() {
		return is_subscribe;
	}
	public void setIs_subscribe(String is_subscribe) {
		this.is_subscribe = is_subscribe;
	}
	public String getTrade_type() {
		return trade_type;
	}
	public void setTrade_type(String trade_type) {
		this.trade_type = trade_type;
	}
	public String getTrade_state() {
		return trade_state;
	}
	public void setTrade_state(String trade_state) {
		this.trade_state = trade_state;
	}
	public String getBank_type() {
		return bank_type;
	}
	public void setBank_type(String bank_type) {
		this.bank_type = bank_type;
	}
	public int getTotal_fee() {
		return total_fee;
	}
	public void setTotal_fee(int total_fee) {
		this.total_fee = total_fee;
	}
	public String getFee_type() {
		return fee_type;
	}
	public void setFee_type(String fee_type) {
		this.fee_type = fee_type;
	}
	public int getCash_fee() {
		return cash_fee;
	}
	public void setCash_fee(int cash_fee) {
		this.cash_fee = cash_fee;
	}
	public String getCash_fee_type() {
		return cash_fee_type;
	}
	public void setCash_fee_type(String cash_fee_type) {
		this.cash_fee_type = cash_fee_type;
	}
	public int getCoupon_fee() {
		return coupon_fee;
	}
	public void setCoupon_fee(int coupon_fee) {
		this.coupon_fee = coupon_fee;
	}
	public int getCoupon_count() {
		return coupon_count;
	}
	public void setCoupon_count(int coupon_count) {
		this.coupon_count = coupon_count;
	}
	public String getTransaction_id() {
		return transaction_id;
	}
	public void setTransaction_id(String transaction_id) {
		this.transaction_id = transaction_id;
	}
	public String getOut_trade_no() {
		return out_trade_no;
	}
	public void setOut_trade_no(String out_trade_no) {
		this.out_trade_no = out_trade_no;
	}
	public String getAttach() {
		return attach;
	}
	public void setAttach(String attach) {
		this.attach = attach;
	}
	public String getTime_end() {
		return time_end;
	}
	public void setTime_end(String time_end) {
		this.time_end = time_end;
	}
	public String getTrade_state_desc() {
		return trade_state_desc;
	}
	public void setTrade_state_desc(String trade_state_desc) {
		this.trade_state_desc = trade_state_desc;
	}
	
	public static WXQueryOrderResult xmlToWXQueryOrderResult(String xml){
		WXQueryOrderResult wr = new WXQueryOrderResult();
		try { 
			StringReader read = new StringReader(xml);
			// 创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入
			InputSource source = new InputSource(read);
			// 创建一个新的SAXBuilder
			SAXBuilder sb = new SAXBuilder();
			// 通过输入源构造一个Document
			Document doc;
			doc = (Document) sb.build(source);

			Element root = doc.getRootElement();// 指向根节点
			List<Element> list = root.getChildren();

			if(list!=null&&list.size()>0){
				for (Element element : list) {
					System.out.println("key是："+element.getName()+"，值是："+element.getText());
					String elementName = element.getName();
					String elementText = element.getText();
					if("return_code".equals(elementName)){
						wr.setReturn_code(elementText);
					}	
					if("return_msg".equals(elementName)){
						wr.setReturn_msg(elementText);
					}
					if("appid".equals(elementName)){
						wr.setAppid(elementText);
					}
					if("mch_id".equals(elementName)){
						wr.setMch_id(elementText);
					}
					if("nonce_str".equals(elementName)){
						wr.setNonce_str(elementText);
					}
					if("sign".equals(elementName)){
						wr.setSign(elementText);
					}
					if("result_code".equals(elementName)){
						wr.setResult_code(elementText);
					}
					if("err_code".equals(elementName)){
						wr.setErr_code(elementText);
					}
					if("err_code_des".equals(elementName)){
						wr.setErr_code_des(elementText);
					}
					if("device_info".equals(elementName)){
						wr.setDevice_info(elementText);
					}
					if("openid".equals(elementName)){
						wr.setOpenid(elementText);
					}
					if("is_subscribe".equals(elementName)){
						wr.setIs_subscribe(elementText);
					}
					if("trade_type".equals(elementName)){
						wr.setTrade_type(elementText);
					}
					if("trade_state".equals(elementName)){
						wr.setTrade_state(elementText);
					}
					if("bank_type".equals(elementName)){
						wr.setBank_type(elementText);
					}
					if("total_fee".equals(elementName)){
						wr.setTotal_fee(Integer.parseInt(elementText));
					}
					if("fee_type".equals(elementName)){
						wr.setFee_type(elementText);
					}
					if("cash_fee".equals(elementName)){
						wr.setCash_fee(Integer.parseInt(elementText));
					}
					if("cash_fee_type".equals(elementName)){
						wr.setCash_fee_type(elementText);
					}
					if("coupon_fee".equals(elementName)){
						wr.setCoupon_fee(Integer.parseInt(elementText));
					}
					if("coupon_count".equals(elementName)){
						wr.setCoupon_count(Integer.parseInt(elementText));
					}
					if("transaction_id".equals(elementName)){
						wr.setTransaction_id(elementText);
					}
					if("out_trade_no".equals(elementName)){
						wr.setOut_trade_no(elementText);
					}
					if("attach".equals(elementName)){
						wr.setAttach(elementText);
					}
					if("time_end".equals(elementName)){
						wr.setTime_end(elementText);
					}
					if("trade_state_desc".equals(elementName)){
						wr.setTrade_state_desc(elementText);
					}
					
				}
			}

		} catch (JDOMException e) {
			e.printStackTrace();
		}  catch (IOException e) {
			e.printStackTrace();
		}catch (Exception e) {
			e.printStackTrace();
		}	
		return wr;
	}
	
}
